package com.niit.base

object Base_08 {

  def main(args: Array[String]): Unit = {
    /*
    集：
      不可变集
      可变集
      集的操作
     */
    // 不可变集： 唯一 无序（添加的顺序和取出的顺序不一致）
    var set1 = Set[Int]() // 不可变的空集
    var set2 = Set(2,1,4,1,2,4,9,8)
    println(set2)

    // 删除元素 1
    var set3 = set2 - 1
    println(set3)
    var set4 =  set2 ++ Set(6,7,8)
    set4 = set4 + 10
    set4 =  set2 ++ List(11,12,13)
    println(set4)

    //可变集 要想使用可变集 需要引包
    import scala.collection.mutable.Set
    var set5 = Set(1,2,3,4,1,2,3,5,1,6)
    println(set5)
    //可变集的操作 也是 += ++= -= --=
    set5 +=10
    set5 --= Set(1,2,3)
    println(set5)

    /*
      映射 -> 字典 -> Map -> 键值对
      不可变Map
      可变Map
      Map的操作
     */
    //不可变Map
    var map1 = Map("张三" -> 23,"李四" -> 24,"王五" -> 25)
    var map2 = Map(("张三",23),("李四",24),("王五",25))
    println(map1)
    println(map2)
    //可变Map  需要手动的引包
    import scala.collection.mutable.Map
    var map3 = Map(("张三",23),("李四",24),("王五",25))
    println(map3)

    //Map的操作
    //根据键修改值
    map3("张三") = 40
    println(map3)
    //根据键获得值
    val value = map3.get("李三")  //如果该键不存在 不会报错而是返回 None
    println(value)
    //获得所有键  和 获得所有值
    println(map3.keys)
    println(map3.values)
    //遍历map3
    for ( (k,v) <- map3 ){
      println(k,v)
    }

    /*
     迭代器：Scala针对每一类集合都提供了一个迭代器，用来做集合遍历访问
      迭代器通常和while配合使用
      hasNext:查询迭代器中是否有下一个元素
      next  返回迭代器中下一个元素
     */
     var list = List(1,2,3,4,5,6,7)
      /*
        1. list.it 按一下回车
        2.list.iterator.var 按一下回车
       */
      val iterator = list.iterator
      while (iterator.hasNext){
        println(iterator.next())
      }

    /*
    函数式编程：方法的参数列表可以接收函数对象。
     */
    //foreach
    var list1 = List(1,2,3,4,5,6,7)
    //目的 用foreach遍历list1       i:Int:表示列表中的每一个元素
    //初级版
    list1.foreach( (i:Int) => println(i) )
    //升级版
    list1.foreach( i => println(i) )  //利用Scala的类型推断的特性
    //究极版  _:表示列表中的每一个元素
    list1.foreach(println(_))

    //map :集合的映射操作是 将一种数据类型转换为另一种数据类型的过程
    // 需求：某电影网站 需要观众对电影进行打分 等级  1 2 3 4 但是观众只能通过 * 方式进行打分
    var list2 = List(1,2,3,4)
    //初级版
    var ll1 = list2.map( (i:Int) => "*" * i )
    println(ll1)
    //升级版
    var ll2 = list2.map( i => "*" * i )
    println(ll2)
    //究极版
    var ll3 = list2.map( "*" * _ )
    println(ll3)

    //flatMap： flatten：扁平化（将列表中的所有子列表合并成一个新的列表） ( (1,2),(3,4),(5,6)  )  => (1,2,3,4,5,6)
    /*
       1.map: 将列表中的每一个元素都拆分为一个 列表
       2.flatten: 将这些拆分后的列表进行合并 ，形成一个新列表
     */    //                   1                     2
     var list3 = List("hadoop hive spark flume","hbase java python java")// (hadoop,hive,spark,flume,hbase,java,python,java)
    //方式一       List ( (hadoop) (hive) (spark) (flume) (hbase) (java) (python) (java) )
    var ll4 = list3.map(_.split(" "))//"hadoop    hive    spark    flume"
    // ll4  List(  (hadoop),(hive),(spark),(flume),(hbase),(java),(python),(java) )
    var ll5 = ll4.flatten
    println(ll5)//(hadoop, hive, spark, flume, hbase, java, python, java)
    //方式二
    var ll6 = list3.flatMap(_.split(" "))
    println(ll6)


  }

}
